<?php
/* ###############################################################################
 *
 * $Id: login.php 46 2014-10-13 15:00:00Z expertsoftware.i@gmail.com $
 *
 * システム名
 *   PHP Web フレームワーク [Ponzu]
 *
 * 機能
 *   認証ライブラリ
 *
 * バージョン
 *   0.0.0_0
 *
 * ライセンス
 *   LGPL v2.0
 *
 * 履歴
 *   2007/07/01 K.Sonohara
 *     新規作成。
 *
 * ###############################################################################*/

/**
 * 認証
 * @access public
 * @param server _SERVER環境変数を指定
 */
function authorizeAdmin($server) {
  // 管理者が設定されていない場合はスキップ
  if (SITE_ADMIN != "") {
    // HTTPベーシック認証
    if (!isset($server['PHP_AUTH_USER']) || ($server['PHP_AUTH_USER'] != SITE_ADMIN) ||
      !isset($server['PHP_AUTH_PW']) || ($server['PHP_AUTH_PW'] != SITE_PASSWORD)) {
      header("WWW-Authenticate: Basic realm=\"".SITE_TITLE."\"");
      errorHTTP(401);
    }
  }
}
/**
 * 認証
 * @access public
 * @param server _SERVER環境変数を指定
 */
function authorizeMember($server) {
	// HTTPベーシック認証
	if (!isset($server['PHP_AUTH_USER']) || ($server['PHP_AUTH_USER'] != SITE_MEMBERUSER) ||
	!isset($server['PHP_AUTH_PW']) || ($server['PHP_AUTH_PW'] != SITE_MEMBERPASS)) {
		header("WWW-Authenticate: Basic realm=\"".SITE_TITLE."\"");
		errorHTTP(401);
	}
}

/**
 * ログファイル出力
 * 利用にはログ出力先の「DIR_LOG」を定義する必要あり
 * @access public
 * @param server _SERVER環境変数を指定
 * @param id ID指定
 */
function startSession($server, $id = "") {
  session_name(SITE_ID. $id);
  session_start();
  session_regenerate_id(true);

  if (!validateSession()) {
    session_destroy();

    errorHTTP(400);
  }

  if (defined("SESSION_LOGIN")) {
   if (!isset($_SESSION[SESSION_USER])) {
      $_SESSION[SESSION_URL] = $_SERVER['REQUEST_URI'];
      header("Location: " . BASE_INC . SESSION_LOGIN);
      exit;
    }
  }
}

/**
 * セッションが適切かチェック
 * @access public
 * @return trueなら問題なし
 */
function validateSession() {
  //ユーザ名検証
  if (isset($_SESSION[SESSION_USER])) {
    $user = $_SESSION[SESSION_USER];
    if (!isset($_SESSION[SESSION_USER_HASH])) {
      return false;
    }
//    if (hash(SITE_HASH, $user) != $_SESSION[SESSION_USER_HASH]) {
//      return false;
//    }
    if (md5($user) != $_SESSION[SESSION_USER_HASH]) {
      return false;
    }

    //ブラウザ検証
    if (!isset($_SESSION["HTTP_USER_AGENT"])) {
      return false;
    }
    if (md5($_SERVER["HTTP_USER_AGENT"]) != $_SESSION["HTTP_USER_AGENT"]) {
      return false;
    }
//    if (hash(SITE_HASH, $_SERVER["HTTP_USER_AGENT"]) != $_SESSION["HTTP_USER_AGENT"]) {
//      return false;
//    }
  }

  return true;
}

/**
 * セッションへログイン情報記録
 * @access public
 * @param $user ユーザ名
 */
function loginSession($user) {
//  $_SESSION["HTTP_USER_AGENT"] =  hash(SITE_HASH, $_SERVER["HTTP_USER_AGENT"]);
  $_SESSION["HTTP_USER_AGENT"] =  md5($_SERVER["HTTP_USER_AGENT"]);
  $_SESSION[SESSION_USER] = $user;
//  $_SESSION[SESSION_USER_HASH] = hash(SITE_HASH, $user);
  $_SESSION[SESSION_USER_HASH] = md5($user);
}

/**
 * ランダムパスワード生成
 * @access public
 * @param $length 長さ
 * @param $keyword パスワードに使用する文字列
 * @return 生成結果
 */
function randamPassword($length=20, $keyword=array("abcdefghijknmopqrstuvwxyz", "ABCDEFGHJKNMPQRSTUVWXYZ", "1234567890-+")) {
  $pwd = "";
  for ($i = 0; $i < $length; $i++) {
    $a = rand(0, count($keyword) - 1);
    $s = rand(0, strlen($keyword[$a]) -1);
    $pwd .= $keyword[$a][$s];
  }

  return $pwd;
}
?>
